package com.xiaoshi.system.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xiaoshi.exception.PlatformException;
import com.xiaoshi.system.dto.SysDictDataDto;
import com.xiaoshi.system.entity.SysDictData;
import com.xiaoshi.system.mapper.SysDictDataMapper;
import com.xiaoshi.system.qo.SysDictDataQo;
import com.xiaoshi.system.service.ISysDictDataService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaoshi.system.vo.DictData;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 字典数据表 服务实现类
 * </p>
 *
 * @author yuankai
 * @since 2022-03-24
 */
@Service
public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDictData> implements ISysDictDataService {

    @Override
    public IPage getPage(SysDictDataQo qo) {
        QueryWrapper qw = new QueryWrapper();


        if (StrUtil.isNotEmpty(qo.getLabel())) {
            qw.eq(SysDictData.DICT_LABEL, qo.getLabel());
        }
        if (StrUtil.isNotEmpty(qo.getValue())) {
            qw.eq(SysDictData.DICT_VALUE, qo.getValue());
        }
        qw.eq(SysDictData.ID, qo.getDictId());
        qw.eq(SysDictData.DICT_TYPE, qo.getType());
        qw.eq(SysDictData.DEL_TAG, 0);
        IPage<SysDictData> page = this.page(new Page<>(qo.getCurrent(), qo.getSize()), qw);

        return page;
    }

    @Override
    public boolean addSysDictData(SysDictDataDto dto) {
        SysDictData byType = getByType(dto.getDictType(), dto.getDictValue());
        if (ObjectUtil.isNotNull(byType)) {
            throw new PlatformException("重复添加");
        }
        SysDictData sysDictData = new SysDictData();
        BeanUtil.copyProperties(dto, sysDictData);

        return this.save(sysDictData);
    }

    @Override
    public boolean editSysDictData(SysDictDataDto dto) {
        SysDictData byType = getByType(dto.getDictType(), dto.getDictValue());
        if (ObjectUtil.isNotNull(byType) && !dto.getId().equals(byType.getId())) {
            throw new PlatformException("已存在！");
        }
        SysDictData sysDictData = new SysDictData();
        BeanUtil.copyProperties(dto, sysDictData);

        return this.updateById(sysDictData);
    }

    @Override
    public SysDictData getByName(String name) {
        QueryWrapper qw = new QueryWrapper();
        if (StrUtil.isNotEmpty(name)) {
            qw.eq(SysDictData.DICT_VALUE, name);
        }
        return getOne(qw);
    }

    @Override
    public boolean delById(Integer id) {
        LambdaUpdateWrapper<SysDictData> luw = new LambdaUpdateWrapper();
        luw.eq(SysDictData::getId, id).set(SysDictData::getDelTag, 1);
        return this.update(luw);
    }

    @Override
    public List<SysDictData> getByType(String type) {
        QueryWrapper qw = new QueryWrapper();
        qw.eq(SysDictData.DICT_TYPE, type);
        qw.eq(SysDictData.DEL_TAG, 0);

        return this.list(qw);

    }

    @Override
    public boolean updateType(String type) {
        LambdaUpdateWrapper<SysDictData> luw = new LambdaUpdateWrapper();
        luw.eq(SysDictData::getDictType, type).set(SysDictData::getDictType, type);
        return this.update(luw);
    }

    public SysDictData getByType(String type, String value) {
        QueryWrapper qw = new QueryWrapper();
        if (StrUtil.isNotEmpty(type)) {
            qw.eq(SysDictData.DICT_TYPE, type);
        }
        if (StrUtil.isNotEmpty(value)) {
            qw.eq(SysDictData.DICT_VALUE, value);
        }
        return getOne(qw);
    }

    @Override
    public List<DictData> getDictDataByType(String type) {
        return baseMapper.getDictDataByType(type);
    }
}
